package utils
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.events.ProgressEvent;
	import flash.filesystem.File;
	import flash.net.FileFilter;
	import flash.utils.getTimer;
	
	[Event(name="complete",type="flash.events.Event")]
	[Event(name="progress",type="utils.FilesLoaderEvent")]
	/**
	 *	多文件加载器[仅限AIR]
	 * @author Roland
	 * 
	 */
	public class FilesLoader extends EventDispatcher
	{
		public function FilesLoader()
		{
			super();
		}
		
		private var _fileArr:Array = [];//待加载的文件列表
		private var _completeFileArr:Array = [];//加载完毕的文件列表
		private var _loadingFile:Object;//正在加载中的文件，可能是File或URLFile
		private var _t:int;
		/**
		 *	 加载传入的文件列表 
		 * @param filesList 要加载的文件列表，其中每个子项应当为 File / URLFile
		 * 
		 */
		public function loadFiles(filesList:Array):void
		{
			_fileArr = filesList;
			loadFile();
		}
		/**
		 * 加载一个文件夹下所有的文件[包括子目录]
		 * @param dirFile 代表此文件夹的file实例
		 * @param fileFilter 文件类型滤镜,根据滤镜中定义的文件类型加载相应文件,不传则加载所有
		 * @param ignoreHidden 是否忽略隐藏文件
		 */
		public function loadDir(dirFile:File,fileFilter:FileFilter=null,ignoreHidden:Boolean = true):void
		{
			if(fileFilter==null)
			{
				_fileArr = FileProxy.getAllFileList(dirFile,ignoreHidden);
			}else{
				_fileArr = FileProxy.getTypicalFileList(dirFile,fileFilter,ignoreHidden);
			}
			loadFile();
		}
		
		private function loadFile():void
		{
			if(_fileArr.length <= 0)
			{
				dispatchEvent(new Event(Event.COMPLETE));
			}else{
				_t = getTimer();
				_loadingFile = _fileArr.pop();
				_loadingFile.addEventListener(Event.COMPLETE,onLoadComplete);
				_loadingFile.load();
			}
		}
		
		private function onLoadComplete(e:Event):void
		{
			_loadingFile.removeEventListener(Event.COMPLETE,onLoadComplete);
			_completeFileArr.push(_loadingFile);
			
			var $progressEvent:FilesLoaderEvent = new FilesLoaderEvent(FilesLoaderEvent.PROGRESS,false,false,_completeFileArr.length,_fileArr.length+_completeFileArr.length);
			$progressEvent.fileName = _loadingFile.name;
			$progressEvent.targetFile = _loadingFile;
			$progressEvent.useTime = getTimer() - _t;
			dispatchEvent($progressEvent);
			
			loadFile();
		}
		
		/**
		 *	释放FilesLoader对已经加载文件的引用，如果外部对这些文件也没有引用时，系统将回收这些文件占用的内存 
		 * 
		 */
		public function releaseReference():void
		{
			_completeFileArr = [];
		}
		/**
		 *	已经加载完毕的文件 (子项为加载完成的File / URLFile，类型取决于调用loadFiles是传入的子项类型)
		 * @return 
		 * 
		 */
		public function get loadedFiles():Array
		{
			return _completeFileArr;
		}
	}
}